﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Input;  
using Bomberman;

namespace BombermanGame
{
	class MapaGraph
	{
		public const int anchoImagen = 48;
		public const int altoImagen = 48;

		private delegate void DibujarGrafico(SpriteBatch spbtch, Vector2 posicion);

		private Dictionary<string, DibujarGrafico> graficos = new Dictionary<string, DibujarGrafico>();
		private Texture2D casillaVacia;
		private Texture2D bloques;
		private Texture2D bomba;
		private Texture2D personaje1;
		private Texture2D personaje2;
		private Texture2D explosion;
		private Texture2D proyectil;
		private Texture2D tanque;
		private Texture2D chala;
		private Texture2D timer;
		private Texture2D mejoraBomba;
		private Texture2D puertaNivel;
		private Texture2D alado;

		public MapaGraph()
		{
			DefinirGraficos();
		}

		private void DefinirGraficos()
		{
			graficos["Bloque Cemento"] = DibujarBloqueCemento;
			graficos["Bloque Ladrillos"] = DibujarBloqueLadrillo;
			graficos["Molotov"] = DibujarMolotov;
			graficos["ToleTole"] = DibujarToleTole;
			graficos["Cecilio"] = DibujarCecilio;
			graficos["Bombita"] = DibujarBombita;
			graficos["Bloque Acero"] = DibujarBloqueAcero;
			graficos["Explosion"] = DibujarExplosion;
			graficos["Proyectil"] = DibujarProyectil;
			graficos["Los López Reggaé"] = DibujarTanque;
			graficos["Habano/Chala"] = DibujarChala;
			graficos["Mejora Bomba Toletole"] = DibujarMejoraToleTole;
			graficos["Timer"] = DibujarTimer;
			graficos["PuertaNivel"] = DibujarPuertaNivel;
			graficos["Los López Reggaé Alados"] = DibujarAlados;

		}


		public void LoadContent(ContentManager Content)
		{
			casillaVacia = Content.Load<Texture2D>("CasillaVacia");
			bloques = Content.Load<Texture2D>("Bloques");
			bomba = Content.Load<Texture2D>("Bomba");
			personaje1 = Content.Load<Texture2D>("Personaje1");
			personaje2 = Content.Load<Texture2D>("Personaje2");
			explosion = Content.Load<Texture2D>("ExplosionSimple");
			proyectil = Content.Load<Texture2D>("Proyectil");
			tanque = Content.Load<Texture2D>("Tanque");
			timer = Content.Load<Texture2D>("TimerArt");
			chala = Content.Load<Texture2D>("chala");
			mejoraBomba = Content.Load<Texture2D>("ToleToleArt");
			puertaNivel = Content.Load<Texture2D>("PuertaNivel");
			alado = Content.Load<Texture2D>("alado");
		}

		public void Draw(SpriteBatch spbtch, Mapa mapa)
		{
			Interactuable contenidoInteractuable;
			Casillero casilleroActual;
			Vector2 posicion;

			for (int fila = 0; fila < mapa.DimencionX; fila++)
			{
				for (int columna = 0; columna < mapa.DimencionY; columna++)
				{
					casilleroActual = mapa.VerCasillero(fila, columna);
					posicion = new Vector2(fila * anchoImagen, columna * altoImagen);

					spbtch.Draw(casillaVacia, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);

					foreach (Posicionable contenido in casilleroActual.ContenidoPosicionable)
					{

						graficos[contenido.ObtenerNombre()](spbtch, posicion);
					}

					if (casilleroActual.Explosion != null)
					{
						graficos["Explosion"](spbtch, posicion);
					}

					if (casilleroActual.Articulos.Contar() != 0)
					{
						contenidoInteractuable = casilleroActual.Articulos.Current();
						if (contenidoInteractuable != null)
							graficos[contenidoInteractuable.ObtenerNombre()](spbtch, posicion);
					}

				}
			}
		}

		public void Update()
		{
			
		}


		private void DibujarProyectil(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(proyectil, posicion, new Rectangle(0, 0, altoImagen, anchoImagen), Color.White);
		}

		private void DibujarExplosion(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(explosion, posicion, new Rectangle(0, 0, altoImagen, anchoImagen), Color.White);
		}

		private void DibujarTanque(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(tanque, posicion, new Rectangle(0, 0, altoImagen, anchoImagen), Color.White);
		}

		// RepresentacionDeObjetos
		private void DibujarBombita(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(personaje1, posicion, new Rectangle(0, 0, altoImagen, altoImagen), Color.White);
		}

		private void DibujarCecilio(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(personaje2, posicion, new Rectangle(0, 0, altoImagen, altoImagen), Color.White);
		}

		private void DibujarMolotov(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(bomba, posicion, new Rectangle(0, 0, altoImagen, altoImagen), Color.White);
		}

		private void DibujarToleTole(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(bomba, posicion, new Rectangle(0, altoImagen, altoImagen, altoImagen), Color.White);
		}

		// hay que dibujarlo
		private void DibujarBloqueAcero(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(bloques, posicion, new Rectangle(anchoImagen*2, 0, anchoImagen, altoImagen), Color.White);
		}

		private void DibujarBloqueCemento(SpriteBatch spbtch, Vector2 posicion)
		{
            spbtch.Draw(bloques, posicion, new Rectangle(anchoImagen, 0, anchoImagen, altoImagen), Color.White);
		}

		private void DibujarBloqueLadrillo(SpriteBatch spbtch, Vector2 posicion)
		{
            spbtch.Draw(bloques, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);
			
		}

		
		private void DibujarChala (SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(chala, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);

		}

		private void DibujarTimer(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(timer, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);

		}

		private void DibujarMejoraToleTole(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(mejoraBomba, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);

		}
        
		private void DibujarPuertaNivel(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(puertaNivel, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);
        
		}

		private void DibujarAlados(SpriteBatch spbtch, Vector2 posicion)
		{
			spbtch.Draw(alado, posicion, new Rectangle(0, 0, anchoImagen, altoImagen), Color.White);

		}
         
         
         
    }
}
